package br.org.alexegidio.jsf;

import java.util.Iterator;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

/**
 * Esta classe possui métodos agrupa métodos comuns utilizados no
 * desenvolvimento JSF de modo a facilitar o acesso a eles
 * 
 * @author alexegidio@yahoo.com.br
 * @since 02/11/2010
 */
public class FacesUtil {

	private static FacesUtil instance = new FacesUtil();

	private FacesUtil() {
	}

	public static FacesUtil getInstance() {
		return instance;
	}

	/**
	 * Envia mensagens de informação para view jsf
	 * 
	 * @param msg
	 */
	public void sendMessageInfo(String msg) {
		sendMessageView(msg, 1);
	}

	/**
	 * Envia mensagem do tipo Erro para a view JSF
	 * 
	 * @param msg
	 *            o conteúdo da mensagem a ser enviada
	 */
	public void sendMessageError(String msg) {
		sendMessageView(msg, 0);
	}

	private void sendMessageView(String msg, int tipo) {

		FacesMessage fm = new FacesMessage();
		if (tipo == 0) {
			fm.setSeverity(FacesMessage.SEVERITY_ERROR);
		} else if (tipo == 1) {
			fm.setSeverity(FacesMessage.SEVERITY_INFO);
		}
		fm.setSummary(msg);
		FacesContext.getCurrentInstance().addMessage(null, fm);
	}

	/**
	 * Recupera um objeto da sessão a partir do id
	 * 
	 * @param objectId
	 *            id do objeto na session
	 * @return retorna um @see Object
	 */
	public Object getSessionObject(String objectId) {
		return FacesContext.getCurrentInstance().getExternalContext()
				.getSessionMap().get(objectId);
	}

	/**
	 * Efetua a busca de um componenent na view a partir de um id informado
	 * 
	 * @param component
	 *            deve ser informado a viewRoot através do método
	 *            facesContext.getViewRoot();
	 * @param id
	 *            o id do component na view JSF
	 * @return um objeto do tipo @see UIComponent
	 */
	public UIComponent findComponent(UIComponent component, String id) {

		if (id.equals(component.getId())) {
			return component;
		}

		UIComponent child = null;
		UIComponent result = null;
		Iterator<UIComponent> childrens = component.getFacetsAndChildren();
		while (childrens.hasNext() && (result == null)) {
			child = (UIComponent) childrens.next();
			if (id.equals(child.getId())) {
				result = child;
				break;
			}
			result = findComponent(child, id);
			if (result != null) {
				break;
			}
		}
		return result;
	}
}
